package algo3c2g15.vista;

import java.awt.Font;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashSet;
import java.util.Set;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

import algo3c2g15.business.EdificioContainer;
import algo3c2g15.controlador.Controlador;
import algo3c2g15.domain.Casa;
import algo3c2g15.domain.Edificio;
import algo3c2g15.domain.EscuelaMilitar;
import algo3c2g15.domain.Humano;
import algo3c2g15.domain.Region;
import algo3c2g15.domain.Unidad;
import algo3c2g15.interfaces.Mortal;

public class PanelComandos extends JPanel{
	private static final long serialVersionUID = 1L;	
	
	private static PanelComandos instance = null;
	
	private JScrollPane paneA = new JScrollPane();		
	private JList listaA = new JList();	
	private JScrollPane paneB = new JScrollPane();		
	private JList listaB = new JList();
	private Font font = new Font("SansSerif",Font.PLAIN,10);
	private JButton construirA = new JButton("Unidad");
	private JButton construirB = new JButton("Edificio");
	private JLabel tituloCons = new JLabel("Seleccione que desea construir: ");
	private JTextField tf = new JTextField();
	private JTextField tf2 = new JTextField();
	private Region region = null;
	private HashSet<Unidad> unidades = new HashSet<Unidad>();
	private Mortal objetivo = null;
	private Humano civil = null;
	private Edificio edificio = null;
	
	private PanelComandos(){
		super();
		MenuJuego.getInstance().add(this);
		setLayout(null);
		setBounds(390, 450, 405, 77);
		setBorder(javax.swing.BorderFactory.createRaisedBevelBorder());
		listaA.setFont(font);
		listaB.setFont(font);
		construirA.setFont(font);
		construirB.setFont(font);
		tituloCons.setFont(new Font("SansSerif",Font.BOLD,11));
		
	}
	
	public void reset(){
		paneA = new JScrollPane();		
		listaA = new JList();	
		paneB = new JScrollPane();		
		listaB = new JList();
		font = new Font("SansSerif",Font.PLAIN,10);
		construirA = new JButton("Unidad");
		construirB = new JButton("Edificio");
		tituloCons = new JLabel("Seleccione que desea construir: ");
		tf = new JTextField();
		tf2 = new JTextField();
		region = null;
		unidades = new HashSet<Unidad>();
		objetivo = null;
		civil = null;
		edificio = null;
	}
	
	public static PanelComandos getInstance() {
		return instance;
	}
	
	public static void create() {
		instance = new PanelComandos();
	}
	
	public void setPanelAtacar(){		
		
		listaA.setBounds(5, 5, 130, 95);
		paneA.setBounds(5,20,150,50);
		
		Vector<String> selUnidad = new Vector<String>();
		selUnidad.add(new String("Unidades..."));
		listaA.setListData(selUnidad);
		
		//Labels
		JLabel unidadesAMover = new JLabel();
		unidadesAMover.setText("Unidades atacantes:");
		unidadesAMover.setBounds(5,0,150,20);
		add(unidadesAMover);
		JLabel regionDestino = new JLabel();
		regionDestino.setText("Objetivo:");
		regionDestino.setBounds(160,15,150,20);
		add(regionDestino);
		
		//region
		tf.setBounds(160, 35, 120, 20);
		tf.setEditable(false);
		add( tf );
		add(paneA);		
		add(listaA);
		
		JButton bLimpiar = new JButton("Limpiar");
		bLimpiar.setBounds(300, 10, 90, 20);
		bLimpiar.addActionListener(new EscuchaBotonLimpiar());
		add( bLimpiar );
		JButton bCancelar = new JButton("Cancelar");
		bCancelar.setBounds(300, 30, 90, 20);
		bCancelar.addActionListener(new EscuchaBotonCancel());
		add( bCancelar );
		JButton bAceptar = new JButton("Aceptar");
		bAceptar.setBounds(300, 50, 90, 20);
		bAceptar.addActionListener(Controlador.getInstance().escuchaBotonAceptar());
		add( bAceptar );
		
		paneA.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
		paneA.setViewportView(listaA);
	}
	
	public void setPanelConquistar(){
		
		//region
		tf.setBounds(15, 10, 200, 20);
		tf.setEditable(false);
		tf.setText("Region a Conquistar");
		add( tf );
		
		tf2.setBounds(15, 40, 200, 20);
		tf2.setEditable(false);
		tf2.setText("Seleccione Civil");
		add( tf2 );
	
		
		JButton bLimpiar = new JButton("Limpiar");
		bLimpiar.setBounds(300, 10, 90, 20);
		bLimpiar.addActionListener(new EscuchaBotonLimpiar());
		add( bLimpiar );
		JButton bCancelar = new JButton("Cancelar");
		bCancelar.setBounds(300, 30, 90, 20);
		bCancelar.addActionListener(new EscuchaBotonCancel());
		add( bCancelar );
		JButton bAceptar = new JButton("Aceptar");
		bAceptar.setBounds(300, 50, 90, 20);
		bAceptar.addActionListener(Controlador.getInstance().escuchaBotonAceptar());
		add( bAceptar );
		
	}
	
	public void setPanelMover(){
		
		listaA.setBounds(5, 5, 130, 95);
		
		paneA.setBounds(5,20,150,50);
		
		Vector<String> selUnidad = new Vector<String>();
		selUnidad.add(new String("Unidades..."));
		
		listaA.setListData(selUnidad);
		
		//Labels
		JLabel unidadesAMover = new JLabel();
		unidadesAMover.setText("Unidades a mover:");
		unidadesAMover.setBounds(5,0,150,20);
		add(unidadesAMover);
		JLabel regionDestino = new JLabel();
		regionDestino.setText("Region destino:");
		regionDestino.setBounds(160,15,150,20);
		add(regionDestino);
		
		//region
		tf.setBounds(160, 35, 120, 20);
		tf.setEditable(false);
		add( tf );
		add(paneA);		
		add(listaA);
		
		JButton bLimpiar = new JButton("Limpiar");
		bLimpiar.setBounds(300, 10, 90, 20);
		bLimpiar.addActionListener(new EscuchaBotonLimpiar());
		add( bLimpiar );
		JButton bCancelar = new JButton("Cancelar");
		bCancelar.setBounds(300, 30, 90, 20);
		bCancelar.addActionListener(new EscuchaBotonCancel());
		add( bCancelar );
		JButton bAceptar = new JButton("Aceptar");
		bAceptar.setBounds(300, 50, 90, 20);
		bAceptar.addActionListener(Controlador.getInstance().escuchaBotonAceptar());
		add( bAceptar );
		
		paneA.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
		paneA.setViewportView(listaA);
	}
	
	public void removerPanel(){
		reset();
		removeAll();
		repaint();
		paneA.setViewportView(null);
		paneB.setViewportView(null);
		listaA.removeAll();
		listaB.removeAll();
	}
	
	public Vector<Mortal> ponerUnidades(){
		Vector<Mortal> v = new Vector<Mortal>();
		for (int i = 0; i < 10; i++)			
			v.add(new Humano());
			
		return v;
		}

	public void setPanelConstruir() {
		
		construirA.setBounds(100, 30, 80, 20);
		construirB.setBounds(200, 30, 80, 20);
		construirA.addActionListener(getListenerUnidades());
		construirB.addActionListener(getListenerEdificios());
		tituloCons.setBounds(100,5,200,20);
		
		add(construirA);
		add(construirB);
		add(tituloCons);
		
		
	}
	
	private ActionListener getListenerEdificios() {
		return new EscuchaBotonEdificio();
	}

	private class EscuchaBotonEdificio implements ActionListener {
		public void actionPerformed(ActionEvent e){
			removerPanel();
			setPanelConstruirEdificio();
			Estados.setEstado(Estados.CONSTRUIR_EDIFICIO);
		}
		
		public void setPanelConstruirEdificio() {
			
			tf.setBounds(5, 5, 250, 25);
			tf.setText(new String("Seleccione civil para construir..."));
						
			tf2.setBounds(5,40,250,25);
			tf2.setText(new String("Seleccione Construccion"));
			
			JButton bConstruccion = new JButton("Construcciones");
			bConstruccion.setBounds(300, 10, 90, 20);
			bConstruccion.setMargin(new Insets(2,2,2,2));
			bConstruccion.setFont(new Font("SansSerif",Font.BOLD,10));
			bConstruccion.addActionListener(new EscuchaBotonConstrucciones());
			

			JButton bCancelar = new JButton("Cancelar");
			bCancelar.setBounds(300, 30, 90, 20);
			bCancelar.addActionListener(new EscuchaBotonCancel());
			add( bCancelar );
			JButton bAceptar = new JButton("Aceptar");
			bAceptar.setBounds(300, 50, 90, 20);
			bAceptar.addActionListener(Controlador.getInstance().escuchaBotonAceptar());
			add( bAceptar );
			
			
			add(tf);
			add(tf2);
			add(bConstruccion);
			
		}
		
		private class EscuchaBotonConstrucciones implements ActionListener {
			public void actionPerformed(ActionEvent e){
				if ( civil != null ) {
					VentanaConstrucciones.createVentanaConstrucciones((Humano)civil);
				}
				else {
					Object[] mensaje = {"Primero seleccione el civil"};
					JOptionPane.showMessageDialog(MenuJuego.getInstance(), mensaje, "Aviso" , JOptionPane.INFORMATION_MESSAGE);
				}
			}
		}
		
	}
	
	private ActionListener getListenerUnidades() {
		return new EscuchaBotonUnidades();
	}

	private class EscuchaBotonUnidades implements ActionListener {
		public void actionPerformed(ActionEvent e){
			removerPanel();
			setPanelConstruirUnidades();
			Estados.setEstado(Estados.CONSTRUIR_UNIDAD);
		}
		
		public void setPanelConstruirUnidades() {
			
			tf.setBounds(5, 5, 250, 25);
			tf.setText("Seleccione edificio donde crear unidad...");			
			add(tf);
			
			tf2.setBounds(5,35,250,25);
			tf2.setText("Unidad que se va a crear");
			add(tf2);
						
			// Botones
			JButton bLimpiar = new JButton("Limpiar");
			bLimpiar.setBounds(300, 10, 90, 20);
			bLimpiar.addActionListener(new EscuchaBotonLimpiar());
			add( bLimpiar );
			JButton bCancelar = new JButton("Cancelar");
			bCancelar.setBounds(300, 30, 90, 20);
			bCancelar.addActionListener(new EscuchaBotonCancel());
			add( bCancelar );
			JButton bAceptar = new JButton("Aceptar");
			bAceptar.setBounds(300, 50, 90, 20);
			bAceptar.addActionListener(Controlador.getInstance().escuchaBotonAceptar());
			add( bAceptar );
		}
		
	}
	
	@SuppressWarnings("unchecked")
	public void addUnidad(Set<Unidad> unidades) {
		if (Estados.getEstado() == Estados.MOVER
				|| Estados.getEstado() == Estados.ATACAR) {
			this.unidades.addAll(unidades);
			listaA.setListData(this.unidades.toArray());
		}
	}
	
	public void addEdificio(Edificio edificio) {
		if (!( edificio instanceof Casa) && !( edificio instanceof EscuelaMilitar) ){
			this.edificio = edificio;
			tf.setText(edificio.toString());
			tf2.setText(edificio.getLoQueConstruye().getSimpleName());	
		}
	}
	
	public void addCivil(Unidad unidad){
		if ( unidad instanceof Humano ){
			Humano civil = (Humano) unidad;
			if ( civil.getNivel() == 1 ) {
				this.civil = civil;
				if (Estados.getEstado() == Estados.CONQUISTAR)
					tf2.setText( unidad.toString());
				else
					tf.setText( unidad.toString());	
			}
		}		
	}
	
	public void addConstruccion(EdificioContainer edificio){
		this.edificio = edificio.getEdificio();
		tf2.setText(edificio.getEdificio().getNombre());
	}
	
	@SuppressWarnings("unchecked")
	public void addRegion(Region region) {
		this.region = region;
		tf.setText( region.toString() );
	}
	
	@SuppressWarnings("unchecked")
	public void addObjetivo(Mortal mortal) {
		this.objetivo = mortal;
		if (objetivo != null)
			tf.setText( objetivo.toString() );
	}
	
	private class EscuchaBotonCancel implements ActionListener
	{	public void actionPerformed(ActionEvent e)
		{
			PanelComandos.getInstance().removerPanel();
			VentanaRegion.cerrar();
			PanelComandos.getInstance().reset();
			Estados.setEstado(Estados.MIRANDO);
		}
	}
	
	private class EscuchaBotonLimpiar implements ActionListener
	{	public void actionPerformed(ActionEvent e) {
			PanelComandos.getInstance().removerPanel();
			if (Estados.getEstado() == Estados.MOVER) {
				PanelComandos.getInstance().setPanelMover();
			}
			if (Estados.getEstado() == Estados.ATACAR) {
				PanelComandos.getInstance().setPanelAtacar();
			}
		}
	}
	
	/**
	 * @return the civil
	 */
	public Humano getCivil() {
		return civil;
	}

	/**
	 * @param civil the civil to set
	 */
	public void setCivil(Humano civil) {
		this.civil = civil;
	}

	/**
	 * @return the edificio
	 */
	public Edificio getEdificio() {
		return edificio;
	}

	/**
	 * @param edificio the edificio to set
	 */
	public void setEdificio(Edificio edificio) {
		this.edificio = edificio;
	}

	/**
	 * @return the region
	 */
	public Region getRegion() {
		return region;
	}

	/**
	 * @param region the region to set
	 */
	public void setRegion(Region region) {
		this.region = region;
	}

	/**
	 * @return the unidades
	 */
	public HashSet<Unidad> getUnidades() {
		return unidades;
	}

	/**
	 * @param unidades the unidades to set
	 */
	public void setUnidades(HashSet<Unidad> unidades) {
		this.unidades = unidades;
	}

	/**
	 * @return the objetivo
	 */
	public Mortal getObjetivo() {
		return objetivo;
	}

	/**
	 * @param objetivo the objetivo to set
	 */
	public void setObjetivo(Mortal objetivo) {
		this.objetivo = objetivo;
	}
}

